<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型链_笔试题1</title>
</head>
<body>
    <script>
        function Foo() {
            getName = function() {
                console.log(1);
            };
            console.log('this', this);
            return this;
        };

        /*
            构造函数Foo() 定义一个变量getName，指向一个function，
            getName在Foo的函数作用域里面
            正如：
            function Foo() {
                let a = 10;
                return a;
            };
            a 只有在函数作用域内部访问才有效

            所以此时Foo.getName === undefined
            Foo().getName === function() {
                console.log(1);
            };

            通俗地说，getName只是Foo函数内部嵌套的函数，自然不能通过Foo.getName进行访问
        */ 

        
        Foo.getName = function() {
            console.log(2);
        };

        /*
            这里相当于给Foo函数添加个getName属性，属性值是一个函数
            function() {
                console.log(2);
            };
        */



        Foo.prototype.getName = function() {
            console.log(3);
        };

        /*
            这里就是给Foo这个构造函数的原型添加属性getName，属性值是一个函数
            function() {
                console.log(3);
            };
        */ 

        var getName = function() {
            console.log(4);
        };

        /*
            函数表达式：全局作用域定义一个变量getName，函数存储在变量里面
        */

        function getName() {
            console.log(5);
        };

        /*
            函数声明：全局定义一个名为getName的函数
        */ 


        Foo.getName();     // 2
        Foo().getName();      // 1    
        getName();      // 4 [函数声明提前，变量声明覆盖函数声明——4]                
        new Foo.getName();  // 2   // [new Foo不是实例！！！这个相当于Foo.getName]
        new Foo().getName();     // 3 // [new Foo() 是实例，实例自身没有getName，就会通过原型链查找，找到Foo.protorype上]
        new new Foo().getName();    // 3 [相当于new Foo().getName()]
    </script>
</body>
</html>